很好 👌 這裡我幫你把 Day 5 的重構案例 改成使用 decimal 型別,並在內容中解釋為什麼金融計算應該用 decimal
而不是 double
。
到目前為止,我們寫的程式都在 Main
方法裡:有變數、判斷式、迴圈。
雖然可以跑,但當同樣的邏輯需要重複出現時,就會造成程式碼冗長又難維護。
今天我們要來認識 C# 的 方法 (Method),看看如何用方法讓程式變得乾淨又好讀。
假設我們要計算三檔股票的成交金額,初學者可能會這樣寫:
using System;
class Program
{
static void Main(string[] args)
{
string stock1 = "2344";
int volume1 = 1000;
decimal price1 = 27.95m;
decimal amount1 = volume1 * price1;
Console.WriteLine($"股票 {stock1} 成交金額為 {amount1}");
string stock2 = "2330";
int volume2 = 500;
decimal price2 = 1280m;
decimal amount2 = volume2 * price2;
Console.WriteLine($"股票 {stock2} 成交金額為 {amount2}");
string stock3 = "2303";
int volume3 = 200;
decimal price3 = 45.7m;
decimal amount3 = volume3 * price3;
Console.WriteLine($"股票 {stock3} 成交金額為 {amount3}");
}
}
👉 問題:
volume * price
」這段邏輯我們可以把「計算成交金額」和「顯示結果」各自抽出成方法。
using System;
class Program
{
static void Main(string[] args)
{
PrintAmount("2344", 1000, 27.95m);
PrintAmount("2330", 500, 1280m);
PrintAmount("2303", 200, 45.7m);
}
// 計算成交金額
static decimal CalculateAmount(int volume, decimal price)
{
return volume * price;
}
// 輸出成交金額
static void PrintAmount(string stock, int volume, decimal price)
{
decimal amount = CalculateAmount(volume, price);
Console.WriteLine($"股票 {stock} 成交金額為 {amount}");
}
}
👉 好處:
CalculateAmount
專心做計算PrintAmount
專心做輸出Main
看起來就很乾淨,只有三行呼叫執行結果:
股票 2344 成交金額為 27950.0
股票 2330 成交金額為 640000.0
股票 2303 成交金額為 9140.0
decimal
?在金融、金錢計算上,一定要避免用 double
。原因是:
double
屬於 浮點數 (floating-point),它在底層是用二進位近似儲存小數。
0.1 + 0.2
在電腦裡可能變成 0.30000000000000004
。decimal
屬於 定點小數 (fixed-point),精度較高,特別適合處理「金額」與「精確小數運算」。
decimal
。👉 簡單來說:
decimal
double
C# 程式一定會有一個 Main
方法,它是程式的入口點,名稱 不能改。
static void Main(string[] args)
string[] args
用來接收命令列參數,例如:
dotnet run 2330 100
args[0] = "2330"
args[1] = "100"
範例:
static void Main(string[] args)
{
if (args.Length >= 2)
{
string stock = args[0];
decimal target = decimal.Parse(args[1]);
Console.WriteLine($"股票 {stock} 的目標價設定為 {target}");
}
else
{
Console.WriteLine("請輸入股票代號與目標價,例如:dotnet run 2330 100");
}
}
預設情況下 Main
是 void
,代表不回傳任何東西。
但也可以寫成 int
,回傳程式的「結束狀態」:
static int Main(string[] args)
{
Console.WriteLine("程式執行完成");
return 0; // 0 代表成功結束
}
在一些系統程式裡,這個數字會被用來判斷程式是否正確執行。
今天我們學會了:
Main
是程式入口點,不能改名args
用來接收命令列參數明天,我們要介紹 類別 (Class) 與物件 (Object),把「股票代號、股價、成交量」封裝成一個 Stock
類別,正式進入物件導向的世界。
要不要我幫你把 Day 6 草稿 也接著寫好,用 Stock
類別封裝股票資料,並帶出屬性與建構子的概念?